

#
# 说明
# 生成lib: make lib
#

# 如果是make lib选项
ifeq ($(MAKECMDGOALS),lib)
  FLAG_IS_LIB = -DBUILD_LIB
  CFLAGS = -fPIC 
endif 

ifeq ($(MAKECMDGOALS),install_lib_all)
  FLAG_IS_LIB = -DBUILD_LIB
  CFLAGS = -fPIC 
endif 


PATH_LIB_INSTALL=
PATH_LIB_RES=

########################################################

CROSS  			= 
CC 	   			= $(CROSS)gcc
CXX    			= $(CROSS)g++
DEBUG  			= -g #-O2
RM     			= rm -rf


# 头文件目录 库文件目录 库文件名字
# 链接库时注意顺序
PATH_INCLUDE	= -I.

PATH_LIB		= -L./

LIBS 			= 

CFLAGS 			+= $(DEBUG) -w -c \
				   $(PATH_INCLUDE) \
				   $(FLAG_IS_LIB) 	

LDFLAGS			+= $(PATH_LIB) $(LIBS) -rdynamic
		 

# 所有源文件、目标文件
SRCS = $(wildcard ./*.c ./*.cpp )
OBJS = $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SRCS)))

# 编译，生成目标文件
%.o : %.c
	$(CXX) $(CFLAGS) $< -o $@ 
%.o : %.cpp
	$(CXX) $(CFLAGS) $< -o $@ 	


VERSION 		= 1.0.0.1
TARGET 			= test.$(VERSION)
NAME_LIB_SHARE	= libxx.so

all: clean $(TARGET)

# 链接，生成可执行文件
$(TARGET) : $(OBJS)
	$(CXX) $^ -o $@ $(LDFLAGS)  

lib: clean build_lib 

build_lib: $(OBJS)
	$(CXX) -shared -g -Wall -o $(NAME_LIB_SHARE) $(LDFLAGS) $^


test:
	@echo [$(SRCS)]
	@echo [$(OBJS)]

nothing:
	@echo do nothing!

clean:
	$(RM) $(TARGET) $(OBJS) $(NAME_LIB_SHARE) 



# 编译选项说明
# -Wall编译后显示所有警告 
# -W 只显示编译器认为会出现错误的警告
# -w 关闭警告 
# -g 编译时增加调试信息,包括符号信息
# -fpermissive 将不一致代码的诊断从错误降级为警告,最好不要用
# -rdynamic 链接选项,让连接器把所有符号（而不仅仅只是程序已使用到的外部符号）都添加到动态符号表（即.dynsym表）里
# -lpthread -lm -ldl 

# vdec 中的编译打印
#  arm-hisiv300-linux-gcc -Wall -g 
#  -I/home/aizizai/work/Hi3536_SDK_V1.0.7.0/mpp_master/include 
#  -I/home/aizizai/work/Hi3536_SDK_V1.0.7.0/mpp_master/sample/vdec/../common  
#  -I/home/aizizai/work/Hi3536_SDK_V1.0.7.0/mpp_master/extdrv/tlv320aic31 
#  -Dhi3536 -DHICHIP=0x35360100 -DHI_RELEASE -DHI_XXXX -lpthread -lm -ldl 
#  -DHI_ACODEC_TYPE_INNER -DHI_ACODEC_TYPE_HDMI   -c -o sample_vdec.o sample_vdec.c

 
# 编译时，头文件的搜寻路径的配置有以下方法： 
# 1. 编译时使用“gcc –I incpath”指定头文件搜寻路径。 
# 2. 编译时使用环境变量 “C_INCLUDE_PATH”指定头文件搜寻路径。 
# 3. 编译时使用gcc的默认头文件搜寻路径
# 
# 链接时，库的搜寻路径的配置有以下方法： 
# 1. 使用 “gcc –Llibpath –llibname”指定链接库搜寻路径。 
# 2. 使用环境变量“LIBRARY_PATH” 指定链接库搜寻路径。 
# 3. 使用ld连接脚本中的 “SEARCH_DIR” 指定链接库搜寻路径
# 
# 运行时，库的搜寻路径的配置有以下方法： 
# 1. 编译时使用 “gcc –Wl,-rpath”指定运行时动态链接库的搜寻路径，硬编码进ELF文件 “RPATH”选项。 
# 2. 编译时使用环境变量 “LD_RUN_PATH”指定运行时动态链接库的搜寻路径，硬编码进ELF文件 “RPATH”选项。 
# 3. 使用环境变量 “LD_LIBRARY_PATH”指定运行时动态链接库的搜寻路径。 
# 4. 使用配置文件“/etc/ld.so.conf”指定运行时动态链接库的搜寻路径。 
# 5. 使用运行时动态链接库的默认搜寻路径“/lib、/usr/lib”。
# --------------------- 
# 版权声明：本文为CSDN博主「copbint」的原创文章，遵循CC 4.0 by-sa版权协议，转载请附上原文出处链接及本声明。
# 原文链接：https://blog.csdn.net/qq_31567335/article/details/82470477

# 示例
# CFLAGS = -g -Wall -I./include -I./include/tinyalsa -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -lc
# LDFLAGS = -L./lib
